import os
import openai
from typing import Union
import requests
import json
from http import HTTPStatus
from urllib.parse import urlparse, unquote
from pathlib import PurePosixPath
from dashscope import ImageSynthesis
import dashscope

from utils import load_config, save_file

# 加载配置文件代码在 utils.load_config
project_config = load_config("config.json")

client = openai.OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

def create_course_script(topic_name, level_of_explanation, age, creativity_level, humour_level):
    """
    根据主题、解释水平、年龄以及创意和幽默水平生成对应的课程脚本。

    :param topic_name: str，课程主题的名称。
    :param level_of_explanation: str，决定解释的复杂程度，值可以为 '初学者', '中级', '高级'。
    :param age: int，授课对象的年龄。
    :param creativity_level: int，创意的级别（1-10），决定讲解中使用创造性元素的程度。
    :param humour_level: int，幽默的级别（1-10），决定讲解中包含幽默的程度。

    :return: str，生成的课程脚本内容，格式化为Markdown。
    """

    # 确保年龄为字符串类型，以便用作提示中的描述
    age_str = str(age)

    # 定义各级别的解释方式
    explanation_levels = {
        '初学者': "用简单易懂的方式解释，帮助读者理解直觉、逻辑和重要性。",
        '中级': "以更复杂和深入的方式解释，假设读者有一些先前知识和理解。",
        '高级': "深入讲解主题细节，假设读者有扎实基础，熟悉中级概念。"
    }

    # 获取对应级别的解释方式，若未提供则默认为'初学者'
    level_string = explanation_levels.get(level_of_explanation, explanation_levels['初学者'])

    # 确定创意和幽默的描述
    creativity_string = (
        "" if creativity_level < 4
        else "在解释时富有创意，以便于理解。" if creativity_level < 7
        else "在解释时富有创意并使用类比。"
    )

    humour_string = (
        "" if humour_level < 4
        else "在解释时带一点幽默。" if humour_level < 7
        else "在解释时增添笑话，使学习更有趣。"
    )

    # 构造提示词，综合所有参数生成课程内容的描述
    prompt = (
        f"请生成一个关于{topic_name}的课程内容。"
        f"授课对象为：{age_str}岁的学生。"
        f"解释关键概念。"
        f"课程内容要求：{level_string}{creativity_string}{humour_string}。"
        f"输出应为Markdown格式。"
        f"只生成 # 和 ## 两层目录结构，其他都作为要点内容"
        f"除了课程内容本身，不要输出其他内容"
    )

    print('prompt=', prompt)

    # 直接调用 API 获取课程脚本
    completion = client.chat.completions.create(
        model="qwen-max",
        messages=[
            {"role": "system", "content": "你是一名专注于科学普及的课程讲师，负责为学生提供清晰的课程内容"},
            {"role": "user", "content": prompt},
        ],
        stream=True
    )

    # 解析 API 返回结果，提取生成的课程脚本内容
    generated_content = ""
    for chunk in completion:
        chunk_content = chunk.choices[0].delta.content
        generated_content += chunk_content
        print(chunk_content, end="")

    # 返回生成的课程脚本内容
    return generated_content

# 读取配置文件中的课程内容信息
title = project_config["title"]
level_of_explanation = project_config["level_of_explanation"]
age = project_config["age"]
creativity_level = project_config["creativity_level"]
humour_level = project_config["humour_level"]

# 调用函数生成课程脚本
script = create_course_script(title, level_of_explanation, age, creativity_level, humour_level)

# 读取配置文件中的课程脚本路径
course_file_path = project_config["course_file_path"].format(title=project_config["title"])

# 调用函数保存课程脚本
save_file(script, course_file_path)